#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <unordered_map>
#include <algorithm>
#define pii pair<int, int>
using namespace std;

// 已知
int n, d;
vector<int> a;
// 未知
unordered_map<int, map<int, int>> g; // 按余数分组
set<int> s;
int cnt = 0; // 记录最多剩下几个

int cal(vector<pii> ks)
{
    if (ks.empty()) return 0;
    int pre_pre = 0, pre = ks[0].second; // 记录前一个和前前一个
    for (int i = 1; i < ks.size(); ++i) // 扫一遍所有的商
    {
        int cur = ks[i].second; 
        if (ks[i].first - ks[i - 1].first == 1) // 相差1个d
        {
            int tmp = max(pre_pre + cur, pre); // 保留i还是保留i-1更好
            pre_pre = pre; // 更新前前一个
            pre = tmp; // 更新前一个
        }
        else //  不是一个d,那直接滑动窗口就行了
        {
            pre_pre = pre;  // 更新前前一个
            pre += cur; // 更新前一个
        }
    }
    return pre;
}

void input()
{
    cin >> n >> d;
    a.resize(n);
    for (int i = 0; i < n; ++i)
    {
        cin >> a[i]; // 按商和余数分组
        if (d != 0)
        {
            int r = a[i] % d;
            int k = (a[i] - r) / d;
            g[r][k]++; // 邻接表建图，余数是r商是k的点加一
        }
    }
}

int main()
{

    input();
    if (d != 0)
    {
        for (auto e : g)
        {
            vector<pii> v; // 余数分组
            for (auto p : e.second)
            {
                v.push_back({p.first, p.second}); // 商和余数压到新的vector里方便遍历
            }
            cnt += cal(v);
        }
    }
    else
    {
        for (auto x : a)
        {
            s.insert(x);
        }
        cnt = s.size();
    }
    cout << n - cnt;
    return 0;
}